from fastapi import APIRouter, Depends  # 导入路由和依赖注入工具
from sqlalchemy.orm import Session  # 导入数据库会话类型
from . import emp_crud  # 导入就业信息CRUD操作
from .emp_database import SessionLocal, Base, engine  # 导入数据库配置
from . import emp_schema  # 导入就业信息数据模型


# 创建数据表（若不存在）
Base.metadata.create_all(bind=engine)

# 创建API路由对象，用于定义就业相关接口
app03 = APIRouter()


# 数据库会话依赖项：提供数据库连接，自动关闭
def get_db():
    db = SessionLocal()  # 创建会话
    try:
        yield db  # 提供会话给接口使用
    finally:
        db.close()  # 接口调用结束后关闭会话


# 获取所有就业信息
@app03.get("/emps/", summary="获取所有学生就业信息")
async def get_emps(db: Session = Depends(get_db)):
    """查询系统中所有学生的就业记录"""
    return emp_crud.get_all_emp(db)


# 按学生编号查询就业信息
@app03.get("/emps/{student_id}", summary="按学生编号查询就业信息")
async def get_id_emp(student_id: int, db: Session = Depends(get_db)):
    """
    通过学生编号查询对应的就业信息
    :param student_id: 学生编号（路径参数）
    :return: 就业信息或不存在提示
    """
    emp = emp_crud.get_id_emp(db, student_id=student_id)
    return emp if emp else {"message": "学生编号不存在"}


# 按公司名称查询就业信息
@app03.get("/emps/company/", summary="按公司名称查询就业信息")
async def get_name_emp(company_name: str, db: Session = Depends(get_db)):
    """查询指定公司的所有学生就业记录"""
    emps = emp_crud.get_name_emp(db, company_name=company_name)
    return emps if emps else {"message": "该公司暂无学生就业记录"}


# 按工资范围查询就业信息
@app03.get("/emps/salary/", summary="按工资范围查询就业信息")
async def get_sal_emp(min_salary: int, max_salary: int, db: Session = Depends(get_db)):
    """查询薪资在[min_salary, max_salary]范围内的就业记录"""
    emps = emp_crud.get_sal_emp(db, min_salary=min_salary, max_salary=max_salary)
    return emps if emps else {"message": "该工资范围内无记录"}


# 添加就业信息
@app03.post("/emps/add/", summary="添加学生就业信息")
async def add_emp(emp: emp_schema.Emp_Schema, db: Session = Depends(get_db)):
    """
    添加新的就业信息
    :param emp: 包含就业信息的请求体（需符合Emp_Schema验证规则）
    :return: 添加结果或已存在提示
    """
    # 检查该学生是否已存在就业信息
    exist_emp = emp_crud.get_id_emp(db, student_id=emp.student_id)
    if exist_emp:
        return {"message": "学生编号已存在"}
    return emp_crud.add_emp(db, emp)


# 修改就业信息
@app03.put("/emps/update/", summary="修改学生就业信息")
async def update_emp(emp: emp_schema.Emp_Schema, db: Session = Depends(get_db)):
    """
    修改学生就业信息（通过student_id定位记录）
    :return: 更新后的记录或不存在提示
    """
    updated_emp = emp_crud.mod_emp(db, emp_schema=emp)
    if updated_emp:
        return updated_emp  # 更新成功，返回更新后的数据
    else:
        return {"message": "要修改的学生不存在"}


# 删除就业信息
@app03.delete("/emps/{student_id}", summary="删除学生就业信息")
async def del_emp(student_id: int, db: Session = Depends(get_db)):
    """通过学生编号删除对应的就业信息"""
    result = emp_crud.delete_emp(db, student_id=student_id)
    return result


# 查询薪资最高的前五名学生
@app03.get("/emps/top5_salary/", summary="查询薪资最高的前五名学生")
async def query_top5_salary(db: Session = Depends(get_db)):
    """返回薪资从高到低排序的前五名学生就业信息"""
    return emp_crud.get_top5_salary(db)


# 统计每个学生的就业时长
@app03.get("/emps/duration/", summary="统计每个学生的就业时长")
async def query_employment_duration(db: Session = Depends(get_db)):
    """计算每个学生从开始求职到收到offer的天数"""
    return emp_crud.get_employment_duration(db)


# 统计每个班级的平均就业时长
@app03.get("/emps/class_avg_duration/", summary="统计每个班级的平均就业时长")
async def query_avg_duration_by_class(db: Session = Depends(get_db)):
    """按班级分组，计算每个班级的平均就业时长（天）"""
    return emp_crud.get_avg_duration_by_class(db)